#!/usr/bin/env python
#
#   Copyright (C) 2006 Jonathan Saggau                                    
#   saggau@gmail.com                                                      
#                                                                         
#   This program is free software; you can redistribute it and/or modify  
#   it under the terms of the GNU General Public License as published by  
#   the Free Software Foundation; either version 2 of the License, or     
#   (at your option) any later version.                                   
#                                                                         
#   This program is distributed in the hope that it will be useful,       
#   but WITHOUT ANY WARRANTY; without even the implied warranty of        
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         
#   GNU General Public License for more details.                          
#                                                                         
#   You should have received a copy of the GNU General Public License     
#   along with this program; if not, write to the                         
#   Free Software Foundation, Inc.,                                       
#   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.  
#

GENERIC = """
(
SynthDef("NAME", 
{ ARGS
BODY
});
)"""

class Synthdef(object):
    def __init__(self, name, body, generic=GENERIC):
        """body = a synthdef body with replacement stubs"""
        self.name = name
        self.body = body
        self.generic = generic

    def _args(self, args):
        argsString = 'arg '
        for eachArg in args.keys():
            argsString = ''.join((argsString, eachArg, ' = ', 
                                  str(args[eachArg]), ', ' ))
        argsString = ''.join((argsString, ';'))
        argsString = argsString.replace(', ;', ';')
        return argsString
        
    def _body(self, replacements):
        synthDefBody = self.body
        for eachString in replacements.keys():
            synthDefBody = synthDefBody.replace(eachString, 
                                                str(replacements[eachString]))
        return synthDefBody
        
    def getString(self, args, replacements):
        outString = self.generic
        outString = outString.replace('NAME', str(self.name))
        outString = outString.replace('ARGS', self._args(args))
        outString = outString.replace('BODY', self._body(replacements))
        return outString